package org.luxor.common.netty.protocol.handler.send;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.luxor.common.netty.protocol.NettyQoS;
import org.luxor.common.netty.protocol.message.NettyPubAckMessage;
import org.luxor.common.netty.protocol.message.NettyPubRecMessage;
import org.luxor.common.netty.protocol.message.NettyPublishMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 消息发布
 *
 * @author Mr.yan @date 2023/12/8
 */
public class SendMessageHandler extends SimpleChannelInboundHandler<NettyPublishMessage> {
    private static final Logger log = LoggerFactory.getLogger(SendMessageHandler.class);

    @Override
    public void channelRead0(ChannelHandlerContext ctx, NettyPublishMessage nettySendMessage) {
        String messageId = nettySendMessage.variableHeader().messageId();
        NettyQoS qosLevel = nettySendMessage.fixedHeader().qosLevel();

        switch (qosLevel) {
            // 至多一次，消息最多推送一次，如果当时客户端不可用，则会丢失该消息。
            case AT_MOST_ONCE:
                break;
            // 至少一次，保证至少收到一次,但是存在重复消费的问题(发送完你告诉我收没收到（PUBACK），如果你不告诉我，我就一直发。)
            case AT_LEAST_ONCE:
                // 确认应答
                ctx.writeAndFlush(NettyPubAckMessage.from(messageId));
                break;
            // 只有一次，确保消息到达，且只会收到一次(我给你发（PUBLISH），你给我回收到了（PUBREC），我再给你发个确定收到了吗（PUBREL），你再给我个收到了收到了（PUBCOMP）
            case EXACTLY_ONCE:
                // 收到应答
                ctx.writeAndFlush(NettyPubRecMessage.from(messageId));
                break;
            default:
                break;
        }
    }


}
